package de.hdu.pms.dao;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import de.hdu.pms.model.Arbeitstag;

public class ArbeitstagDao extends HibernateDaoSupport{
	
	public static Logger Log = Logger.getLogger(ArbeitstagDao.class);
	public static void setLog(Logger log){
		Log = log;
	}
	/**
	 * returns all entries from the table Arbeitstag with a special id
	 * @return a list of Arbeitstag
	 * @see Arbeitstag
	 */
	
	public Arbeitstag findById(int arbeitstag_id){
		HibernateTemplate template = getHibernateTemplate();
		return (Arbeitstag) template.get(Arbeitstag.class, arbeitstag_id);
	}
	
	/**
	 * Lists all entries from the table Arbeitstag
	 * @returns als list of Arbeitstag
	 * @see Arbeitstag
	 * @author BBV
	 */
	
	public List<Arbeitstag> findAll(){
		HibernateTemplate template = getHibernateTemplate();
		List<Arbeitstag> results = template.loadAll(Arbeitstag.class);
		return results;
	}
	
	/**
	 * Saves a entry for the table Arbeitstag
	 * @return arbeitstag
	 * @param arbeitstag
	 * @author BBV
	 */
	
	public Arbeitstag save(Arbeitstag arbeitstag){
		HibernateTemplate template = getHibernateTemplate();
		template.saveOrUpdate(arbeitstag);
		return arbeitstag;
	}
	
	/**
	 * deletes a entry in the table arbeitstag
	 * @param arbeitstag
	 * @author BBV
	 */
	public void delete(Arbeitstag arbeitstag){
		HibernateTemplate template = getHibernateTemplate();
		template.delete(arbeitstag);
	}
		
	/**
	 * get the current worker state
	 * @param mit_id
	 * @return Integer status
	 */
	
	@SuppressWarnings("unchecked")
	public Arbeitstag findByDate(Date datum, Integer mit_id) {
		HibernateTemplate template = getHibernateTemplate();

		SimpleDateFormat formatDatum = new SimpleDateFormat("yyyy-MM-dd");

		String atagQuery = "from Arbeitstag atag where atag.mitarbeiter.id = "
				+ mit_id + " and atag.atag_datum = '"
				+ formatDatum.format(datum) + "'";
		List<Arbeitstag> atag = template.find(atagQuery);
		if (atag.isEmpty()) {
			return null;
		} else {
			Integer arbeitstag_id = atag.get(0).getId();
			return (Arbeitstag) template.get(Arbeitstag.class, arbeitstag_id);
		}
	}
	
	/***
	 * 
	 * findet alle nicht beendeten Arbeitstage, welche aufgrund eines Bedienfehlers entstanden sind
	 * 
	 * @param datum
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<Arbeitstag> findCron(Date datum){
		HibernateTemplate template = getHibernateTemplate();
		SimpleDateFormat formatDatum = new SimpleDateFormat("yyyy-MM-dd");
		List<Arbeitstag> results = template.find("from Arbeitstag a where a.atag_datum <> '"+formatDatum.format(datum)+ "' and a.atag_bis is null");
		return results;
	}
	
	/***
	 * 
	 * findet alle Arbeitstage eines Mitarbeiters im bestimmten Zeitraum
	 * 
	 * @param start
	 * @param end
	 * @param mit_id
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<Arbeitstag> findBySpan(Date start, Date end, Integer mit_id){
		HibernateTemplate template = getHibernateTemplate();
		SimpleDateFormat formatDatum = new SimpleDateFormat("yyyy-MM-dd");
		List<Arbeitstag> results = template.find("from Arbeitstag a where a.atag_datum between '"+formatDatum.format(start)+ "' and '"+formatDatum.format(end)+"' and a.mitarbeiter.id = " + mit_id);
		return results;		
	}
}
